#include <iostream>
#include <format> //C++ 20
#include <source_location> //C++ 20
#include <string>
#include <vector>
#include <string>

#include "log.h"

//format 普通用法
void formatTest()
{
	using namespace std;

	//vector<int> v{ 1,2,3,4,4 };

	//大括号表示占位符，数量必须匹配
	auto str = std::format("lalala {} {} {}", "hahaha", 777, 3.14);
	cout << str << endl;

	//大括号中可以设置输出顺序
	auto str2 = format("xixixi {} {}", 1, 2);
	cout << str2 << endl;

	//:4d表示4个空格对齐，默认右对齐
	string str3 = format("[{:4d}]", 5);
	cout << str3 << endl; //[   5]

	//0:*<4d，0表示输出顺序（同上） <表示右对其，用*填充剩余字符
	string str4 = format("{0:*<4d}", 6);
	cout << str4 << endl; //6***

	//10个空格剧中显示 保留整数的加号  保留4位小数位
	string str5 = format("[{: ^+10.4f}]", 3.1415926535);
	cout << str5 << endl; //[ +3.1416  ]
	//对齐数 和 小数位数 (等等) 都可以动态指定
	string str6 = format("{: >+{}.{}f}", 3.1415926535, 10, 6);
	cout << str6 << endl; //   +3.1416

	//.s 保留字符串的字符数
	str6 = format("{:.5s}", "hello world");
	cout << str6 << endl;
}
void log(std::string msg, std::source_location loc = std::source_location::current()) //默认参数规定在函数调用处展开，所以loc获取的是函数调用处的行号
{
	std::cout << loc.file_name() << ":" << loc.line() << ":" << " [info] " << msg << '\n';
}

void source_locationTest()
{
	using namespace std;
	std::source_location loc = std::source_location::current(); //获取当前行的各种信息

	cout << loc.file_name() << ":" << loc.function_name() << ":" << loc.line() << endl;

	//一般用法
	log("hello");
	log("world");

}


int main(void)
{
	int n = 10;
	log_info("n = {}", n);
	LOG_PRINT(n);
	std::string str = "lalala";
	LOG_PRINT(str);

	log_critical("{}{}", 10, 3.14);


	std::cout << "===========================================" << std::endl;

	//设置日志级别
	set_log_level(log_level::trace);
	//设置日志目录
	set_log_file("./log.log");

	log_trace("lalala");
	log_debug("lalala");
	log_info("lalala");
	log_critical("lalala");
	log_warning("lalala");
	log_error("lalala");
	log_fatal("lalala");
	
	std::cout << "hello world" << std::endl;

	return 0;
}